package com.martin.lib_base.model

import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.MutableLiveData
import androidx.recyclerview.widget.RecyclerView
import com.martin.lib_base.bean.BaseListBean
import com.martin.lib_base.interfaces.IGetData
import com.martin.lib_base.ktx.loadMore
import com.martin.lib_base.ktx.loge
import com.martin.lib_base.ktx.refresh
import com.scwang.smart.refresh.layout.SmartRefreshLayout

/**
 * @author：Houge
 * @date：2022/12/1
 * @desc：分页用工具
 */
class PageModel {

    //页码
    var page: Int = 1

    //最后一条ID
    var lastId: Int = 0

    //当前是否有数据
    val haveData = MutableLiveData<Boolean>(true)

    /**
     * 刷新状态
     */
    val status = MutableLiveData(RefreshStatus.NONE)

    /**
     * 是否有更多数据
     * 用于决定刷新布局能否加载更多, 没有更多数据时显示"没有更多数据了"
     */
    val haveMore = MutableLiveData(true)


    //列表布局
    private var rv: RecyclerView? = null
    //刷新控件
    private var srl: SmartRefreshLayout? = null

    /**
     * 刷新
     */
    fun refresh() {
        page = 1
        lastId = 0
        status.postValue(RefreshStatus.REFRESH)
        haveMore.postValue(true)
    }

    /**
     * 加载更多
     */
    fun loadMore() {
        page += 1
        status.postValue(RefreshStatus.MORE)
    }

    /**
     * 当前是否为刷新模式，否则为加载更多模式
     */
    fun isRefresh() = page == 1

    /**
     * 绑定刷新布局逻辑
     */
    fun bindSmartRefreshLayout(
        //刷新布局
        srl: SmartRefreshLayout,
        //列表布局
        rv: RecyclerView,
        //获取数据对象
        getData: IGetData,
        //生命周期持有者
        lifecycleOwner: LifecycleOwner
    ) {
        this.rv = rv
        this.srl = srl
        srl.post {
            // 监听刷新事件
            srl.setOnRefreshListener {
                refresh()
                loge("---------srl.setOnRefreshListener")
                getData.getData()
                srl.finishRefresh()
                srl.resetNoMoreData()
            }
            // 监听加载更多
            srl.setOnLoadMoreListener {
                loadMore()
                loge("---------srl.setOnLoadMoreListener")
                getData.getData()
            }

            lifecycleOwner.let {
                //观察是否下拉刷新完成
                status.observe(lifecycleOwner) {
                    loge("loadRefreshing =============== $it")
                    if (it == RefreshStatus.REFRESH) {
                        // 正在下拉刷新中

                    } else if (it == RefreshStatus.MORE) {
                        // 正在上拉加载更多

                    } else {
                        if (page == 1) {
                            srl.finishRefresh()
                        } else {
                            srl.finishLoadMore()
                        }
                    }

                }

                // 观察是否可以加载更多数据
                haveMore.observe(lifecycleOwner) {
                    if (it) {
                        // 有更多数据
                        srl.finishLoadMore()
                    } else {
                        // 没有更多数据
                        srl.finishLoadMoreWithNoMoreData()
                    }
                }
            }
        }
    }

    /**
     * 处理列表数据
     */
    fun handleDataList(list: List<Any>?) {
        rv?.let {
            it.post {
                if (isRefresh()) {
                    it.refresh(list)
                } else {
                    it.loadMore(list)
                }
            }
        }

        // 结束下拉刷新
        status.postValue(RefreshStatus.NONE)

        /**
            这里做一层处理
            后台给的Count不确定是否有效
            那么先判断获取的list是不是空的
            空数据则表示没有更多
            有数据则根据count进行判定
         */
        if (list.isNullOrEmpty()) {
            haveMore.postValue(false)
        } else {
            haveMore.postValue(true)
        }
    }

    /**
     * 处理listBean数据
     */
    fun handleListBean(listBean: BaseListBean<*>) {
        lastId = listBean.lastId
        handleDataList(listBean.list)
        haveMore.postValue(listBean.currentPage < listBean.lastPage)
    }
}

/**
 * 刷新状态枚举
 */
enum class RefreshStatus {
    NONE,       // 未刷新
    REFRESH,    // 下拉刷新中
    MORE        // 上拉加载更多中
}